import { IPSModelObject } from '../../ipsmodel-object';
import { IPSDataEntity } from '../ipsdata-entity';
import { IPSDEAction } from './ipsdeaction';
import { IPSDEDataSync } from '../datasync/ipsdedata-sync';
import { IPSDEField } from '../defield/ipsdefield';
import { IPSDEFValueRule } from '../defield/valuerule/ipsdefvalue-rule';
import { IPSDERBase } from '../der/ipsderbase';
import { IPSDEDataSet } from '../ds/ipsdedata-set';
import { IPSDELogic } from '../logic/ipsdelogic';
import { IPSDEMainState } from '../mainstate/ipsdemain-state';
import { IPSDENotify } from '../notify/ipsdenotify';
import { IPSLanguageRes } from '../../res/ipslanguage-res';
import { IPSSysLogic } from '../../res/ipssys-logic';
import { IPSSysSFPlugin } from '../../res/ipssys-sfplugin';
import { IPSSysSequence } from '../../res/ipssys-sequence';
import { IPSSysTranslator } from '../../res/ipssys-translator';

/**
 *
 * 子接口类型识别属性[]
 * @export
 * @interface IPSDEActionLogic
 */
export interface IPSDEActionLogic extends IPSModelObject {
  /**
   * 行为逻辑类型
   * @description 值模式 [实体行为附加逻辑类型] {1：内部逻辑、 0：外部逻辑、 2：脚本代码、 3：实体通知、 4：填充实体主状态、 5：实体数据同步、 6：目标数据操作（指定主关系）、 7：目标数据操作（指定数据集）、 8：系统预置逻辑、 9：属性值转换、 10：属性值序列填充、 50：检查属性值规则、 51：检查数据主状态（处于）、 52：检查数据主状态（不处于）、 53：检查目标数据存在（指定主关系）、 54：检查目标数据不存在（指定主关系）、 55：检查目标数据存在（指定数据集）、 56：检查目标数据不存在（指定数据集） }
   * @type {( number | 1 | 0 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 50 | 51 | 52 | 53 | 54 | 55 | 56)}
   */
  actionLogicType: number | 1 | 0 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 50 | 51 | 52 | 53 | 54 | 55 | 56;

  /**
   * 附加模式
   * @description 值模式 [实体行为逻辑附加模式] {PREPARE：准备、 CHECK：检查、 BEFORE：执行之前、 AFTER：执行之后 }
   * @type {( string | 'PREPARE' | 'CHECK' | 'BEFORE' | 'AFTER')}
   */
  attachMode: string | 'PREPARE' | 'CHECK' | 'BEFORE' | 'AFTER';

  /**
   * 数据同步事件
   * @description 值模式 [平台数据通知监控行为（新建、更新、删除）] {1：新建、 2：更新、 4：删除、 256：自定义、 512：自定义2 }
   * @type {( number | 1 | 2 | 4 | 256 | 512)}
   * @default 0
   */
  dataSyncEvent: number | 1 | 2 | 4 | 256 | 512;

  /**
   * 目标实体
   *
   * @type {IPSDataEntity}
   */
  getDstPSDE(): IPSDataEntity | null;

  /**
   * 目标实体
   *
   * @type {IPSDataEntity}
   */
  get dstPSDE(): IPSDataEntity | null;

  /**
   * 目标实体（必须存在）
   *
   * @type {IPSDataEntity}
   */
  getDstPSDEMust(): IPSDataEntity;

  /**
   * 目标实体行为
   *
   * @type {IPSDEAction}
   */
  getDstPSDEAction(): IPSDEAction | null;

  /**
   * 目标实体行为
   *
   * @type {IPSDEAction}
   */
  get dstPSDEAction(): IPSDEAction | null;

  /**
   * 目标实体行为（必须存在）
   *
   * @type {IPSDEAction}
   */
  getDstPSDEActionMust(): IPSDEAction;

  /**
   * 目标实体数据集
   *
   * @type {IPSDEDataSet}
   */
  getDstPSDEDataSet(): IPSDEDataSet | null;

  /**
   * 目标实体数据集
   *
   * @type {IPSDEDataSet}
   */
  get dstPSDEDataSet(): IPSDEDataSet | null;

  /**
   * 目标实体数据集（必须存在）
   *
   * @type {IPSDEDataSet}
   */
  getDstPSDEDataSetMust(): IPSDEDataSet;

  /**
   * 错误代码
   * @type {number}
   * @default 0
   */
  errorCode: number;

  /**
   * 错误信息
   * @type {string}
   */
  errorInfo: string;

  /**
   * 错误信息语言资源对象
   *
   * @type {IPSLanguageRes}
   */
  getErrorInfoPSLanguageRes(): IPSLanguageRes | null;

  /**
   * 错误信息语言资源对象
   *
   * @type {IPSLanguageRes}
   */
  get errorInfoPSLanguageRes(): IPSLanguageRes | null;

  /**
   * 错误信息语言资源对象（必须存在）
   *
   * @type {IPSLanguageRes}
   */
  getErrorInfoPSLanguageResMust(): IPSLanguageRes;

  /**
   * 异常对象
   * @type {string}
   */
  exceptionObj: string;

  /**
   * 行为逻辑动态参数
   * @type {IModel}
   */
  logicParams: IModel;

  /**
   * 主控关系
   *
   * @type {IPSDERBase}
   */
  getMajorPSDER(): IPSDERBase | null;

  /**
   * 主控关系
   *
   * @type {IPSDERBase}
   */
  get majorPSDER(): IPSDERBase | null;

  /**
   * 主控关系（必须存在）
   *
   * @type {IPSDERBase}
   */
  getMajorPSDERMust(): IPSDERBase;

  /**
   * 实体数据同步
   *
   * @type {IPSDEDataSync}
   */
  getPSDEDataSync(): IPSDEDataSync | null;

  /**
   * 实体数据同步
   *
   * @type {IPSDEDataSync}
   */
  get psDEDataSync(): IPSDEDataSync | null;

  /**
   * 实体数据同步（必须存在）
   *
   * @type {IPSDEDataSync}
   */
  getPSDEDataSyncMust(): IPSDEDataSync;

  /**
   * 属性值规则
   *
   * @type {IPSDEFValueRule}
   */
  getPSDEFValueRule(): IPSDEFValueRule | null;

  /**
   * 属性值规则
   *
   * @type {IPSDEFValueRule}
   */
  get psDEFValueRule(): IPSDEFValueRule | null;

  /**
   * 属性值规则（必须存在）
   *
   * @type {IPSDEFValueRule}
   */
  getPSDEFValueRuleMust(): IPSDEFValueRule;

  /**
   * 属性对象
   *
   * @type {IPSDEField}
   */
  getPSDEField(): IPSDEField | null;

  /**
   * 属性对象
   *
   * @type {IPSDEField}
   */
  get psDEField(): IPSDEField | null;

  /**
   * 属性对象（必须存在）
   *
   * @type {IPSDEField}
   */
  getPSDEFieldMust(): IPSDEField;

  /**
   * 实体逻辑
   *
   * @type {IPSDELogic}
   */
  getPSDELogic(): IPSDELogic | null;

  /**
   * 实体逻辑
   *
   * @type {IPSDELogic}
   */
  get psDELogic(): IPSDELogic | null;

  /**
   * 实体逻辑（必须存在）
   *
   * @type {IPSDELogic}
   */
  getPSDELogicMust(): IPSDELogic;

  /**
   * 实体主状态
   *
   * @type {IPSDEMainState}
   */
  getPSDEMainState(): IPSDEMainState | null;

  /**
   * 实体主状态
   *
   * @type {IPSDEMainState}
   */
  get psDEMainState(): IPSDEMainState | null;

  /**
   * 实体主状态（必须存在）
   *
   * @type {IPSDEMainState}
   */
  getPSDEMainStateMust(): IPSDEMainState;

  /**
   * 实体通知
   *
   * @type {IPSDENotify}
   */
  getPSDENotify(): IPSDENotify | null;

  /**
   * 实体通知
   *
   * @type {IPSDENotify}
   */
  get psDENotify(): IPSDENotify | null;

  /**
   * 实体通知（必须存在）
   *
   * @type {IPSDENotify}
   */
  getPSDENotifyMust(): IPSDENotify;

  /**
   * 系统预置逻辑
   *
   * @type {IPSSysLogic}
   */
  getPSSysLogic(): IPSSysLogic | null;

  /**
   * 系统预置逻辑
   *
   * @type {IPSSysLogic}
   */
  get psSysLogic(): IPSSysLogic | null;

  /**
   * 系统预置逻辑（必须存在）
   *
   * @type {IPSSysLogic}
   */
  getPSSysLogicMust(): IPSSysLogic;

  /**
   * 后台扩展插件
   *
   * @type {IPSSysSFPlugin}
   */
  getPSSysSFPlugin(): IPSSysSFPlugin | null;

  /**
   * 后台扩展插件
   *
   * @type {IPSSysSFPlugin}
   */
  get psSysSFPlugin(): IPSSysSFPlugin | null;

  /**
   * 后台扩展插件（必须存在）
   *
   * @type {IPSSysSFPlugin}
   */
  getPSSysSFPluginMust(): IPSSysSFPlugin;

  /**
   * 系统值序列
   *
   * @type {IPSSysSequence}
   */
  getPSSysSequence(): IPSSysSequence | null;

  /**
   * 系统值序列
   *
   * @type {IPSSysSequence}
   */
  get psSysSequence(): IPSSysSequence | null;

  /**
   * 系统值序列（必须存在）
   *
   * @type {IPSSysSequence}
   */
  getPSSysSequenceMust(): IPSSysSequence;

  /**
   * 系统值转换器
   *
   * @type {IPSSysTranslator}
   */
  getPSSysTranslator(): IPSSysTranslator | null;

  /**
   * 系统值转换器
   *
   * @type {IPSSysTranslator}
   */
  get psSysTranslator(): IPSSysTranslator | null;

  /**
   * 系统值转换器（必须存在）
   *
   * @type {IPSSysTranslator}
   */
  getPSSysTranslatorMust(): IPSSysTranslator;

  /**
   * 脚本代码
   * @type {string}
   */
  scriptCode: string;

  /**
   * 克隆传入参数
   * @type {boolean}
   * @default false
   */
  cloneParam: boolean;

  /**
   * 支持后台执行
   * @type {boolean}
   * @default true
   */
  enableBackend: boolean;

  /**
   * 忽略异常
   * @type {boolean}
   * @default false
   */
  ignoreException: boolean;

  /**
   * 内部逻辑
   * @type {boolean}
   */
  internalLogic: boolean;

  /**
   * 准备操作之前数据
   * @type {boolean}
   * @default false
   */
  prepareLast: boolean;

  /**
   * 启用
   * @type {boolean}
   * @default true
   */
  valid: boolean;
}
